<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <h1 data-lake-id="XqMeF" id="XqMeF"><span data-lake-id="u7323ed9d" id="u7323ed9d">典型回答</span></h1>
  <p data-lake-id="u68fc9043" id="u68fc9043"><br></p>
  <p data-lake-id="u67af6d94" id="u67af6d94"><span data-lake-id="u8e094441" id="u8e094441">为了提升web应用的各方面能力，我们一般会把多台机器组成一个集群对外提供服务。然而，我们的网站对外提供的访问入口都是一个的，比如www.hollischuang.com。那么当用户在浏览器输入www.hollischuang.com的时候如何将用户的请求分发到集群中不同的机器上呢，这就是负载均衡在做的事情。</span></p>
  <p data-lake-id="u1ac249d2" id="u1ac249d2"><span data-lake-id="uc5293fea" id="uc5293fea">​</span><br></p>
  <p data-lake-id="uf7504cb6" id="uf7504cb6"><strong><span data-lake-id="ub4394eef" id="ub4394eef">负载均衡（Load Balance），意思是将负载（工作任务，访问请求）进行平衡、分摊到多个操作单元（服务器，组件）上进行执行。是解决高性能，单点故障（高可用），扩展性（水平伸缩）的终极解决方案。</span></strong></p>
  <p data-lake-id="u933cf3fa" id="u933cf3fa"><br></p>
  <p data-lake-id="u0c1740fa" id="u0c1740fa"><span data-lake-id="u7cbd6425" id="u7cbd6425">负载均衡服务器在决定将请求转发到具体哪台真实服务器的时候，是通过负载均衡算法来实现的。负载均衡算法，是一个负载均衡服务器的核心。</span></p>
  <p data-lake-id="u510a11d9" id="u510a11d9"><br></p>
  <p data-lake-id="ub09bdf56" id="ub09bdf56"><span data-lake-id="u75908c0e" id="u75908c0e">负载均衡算法可以分为两类：静态负载均衡算法和动态负载均衡算法。</span></p>
  <p data-lake-id="ue2e16f74" id="ue2e16f74"><br></p>
  <p data-lake-id="u63e29c1b" id="u63e29c1b"><span data-lake-id="uf62dcd60" id="uf62dcd60">静态负载均衡算法包括：轮询，比率，优先权</span></p>
  <p data-lake-id="ufed38322" id="ufed38322"><br></p>
  <p data-lake-id="ub8e08788" id="ub8e08788"><span data-lake-id="ue3bfca1a" id="ue3bfca1a">动态负载均衡算法包括: 最少连接数,最快响应速度，观察方法，预测法，动态性能分配，动态服务器补充，服务质量，服务类型，规则模式。</span></p>
  <h1 data-lake-id="gtYXP" id="gtYXP"><span data-lake-id="u61abaf1d" id="u61abaf1d">扩展知识</span></h1>
  <p data-lake-id="uf10144cf" id="uf10144cf"><span data-lake-id="u6a4fceb9" id="u6a4fceb9">​</span><br></p>
  <h2 data-lake-id="fqFvi" id="fqFvi"><span data-lake-id="u571e0377" id="u571e0377">负载均衡分类</span></h2>
  <p data-lake-id="u1adea1d6" id="u1adea1d6"><br></p>
  <p data-lake-id="ucb0bc3e7" id="ucb0bc3e7"><span data-lake-id="ucb12e999" id="ucb12e999">想要实现负载均衡，其实有很多种做法，在深入介绍负载均衡之前，要先介绍一个概念，那就是OSI七层模型。</span></p>
  <p data-lake-id="uce978a25" id="uce978a25"><br></p>
  <p data-lake-id="u559cc7c3" id="u559cc7c3"><strong><span data-lake-id="u13286dd5" id="u13286dd5">OSI是一个开放性的通信系统互连参考模型，他是一个定义得非常好的协议规范。</span></strong></p>
  <p data-lake-id="u45861a15" id="u45861a15"><br></p>
  <p data-lake-id="u829af7c4" id="u829af7c4"><span data-lake-id="ud4bb5047" id="ud4bb5047">OSI模型有7层结构，每层都可以有几个子层。 OSI的7层从上到下分别是 </span></p>
  <p data-lake-id="u26cac85e" id="u26cac85e"><span data-lake-id="u9c873c1f" id="u9c873c1f">7、应用层；</span></p>
  <p data-lake-id="udbb61b83" id="udbb61b83"><span data-lake-id="u9ab8bc84" id="u9ab8bc84">6、表示层；</span></p>
  <p data-lake-id="u46c4fec5" id="u46c4fec5"><span data-lake-id="ub9743005" id="ub9743005">5、会话层；</span></p>
  <p data-lake-id="u6f4d1fc9" id="u6f4d1fc9"><span data-lake-id="u47d4e95b" id="u47d4e95b">4、传输层；</span></p>
  <p data-lake-id="ud42ec5ee" id="ud42ec5ee"><span data-lake-id="u93fa40ae" id="u93fa40ae">3、网络层；</span></p>
  <p data-lake-id="u5e4ad689" id="u5e4ad689"><span data-lake-id="u33a887b9" id="u33a887b9">2、数据链路层；</span></p>
  <p data-lake-id="ub0e8f3fe" id="ub0e8f3fe"><span data-lake-id="u6b7c90f3" id="u6b7c90f3">1、物理层；</span></p>
  <p data-lake-id="uf08f3984" id="uf08f3984"><br></p>
  <p data-lake-id="uea059b95" id="uea059b95"><span data-lake-id="u3c28f067" id="u3c28f067">其中高层（即7、6、5、4层）定义了应用程序的功能，下面3层（即3、2、1层）主要面向通过网络的端到端的数据流。</span></p>
  <p data-lake-id="udbd965bf" id="udbd965bf"><br></p>
  <p data-lake-id="ua5810a57" id="ua5810a57"><span data-lake-id="udd5092b9" id="udd5092b9">在这七层模型种，高层次都是依赖于低层次的。层次越高，使用起来越方便。</span></p>
  <p data-lake-id="ucf90959f" id="ucf90959f"><br></p>
  <p data-lake-id="u4da84fbc" id="u4da84fbc"><img src="http://www.hollischuang.com/wp-content/uploads/2018/12/15448592825603.jpg?x-oss-process=image%2Fwatermark%2Ctype_d3F5LW1pY3JvaGVp%2Csize_29%2Ctext_SmF2YSA4IEd1IFA%3D%2Ccolor_FFFFFF%2Cshadow_50%2Ct_80%2Cg_se%2Cx_10%2Cy_10"><span data-lake-id="u705de1db" id="u705de1db">​</span></p>
  <p data-lake-id="ub0e6b648" id="ub0e6b648"><br></p>
  <p data-lake-id="u4489ea3e" id="u4489ea3e"><span data-lake-id="uef6d3ea3" id="uef6d3ea3">我们经常听到的一些和计算机网络有关的概念中：</span></p>
  <p data-lake-id="u421786df" id="u421786df"><br></p>
  <blockquote data-lake-id="u01443e3e" id="u01443e3e">
   <p data-lake-id="ubd510a89" id="ubd510a89"><span data-lake-id="u8d158f49" id="u8d158f49">telnet、HTTP、FTP、NFS、SMTP、DNS等属于第七层应用层的概念。</span></p>
   <p data-lake-id="u595c0704" id="u595c0704"><span data-lake-id="u11879bcf" id="u11879bcf"> </span></p>
   <p data-lake-id="u70f23bbf" id="u70f23bbf"><span data-lake-id="ua7a42bd5" id="ua7a42bd5">TCP、UDP、SPX等属于第四层传输层的概念。</span></p>
   <p data-lake-id="uab334fce" id="uab334fce"><span data-lake-id="u381e4195" id="u381e4195"> </span></p>
   <p data-lake-id="u72f5c95e" id="u72f5c95e"><span data-lake-id="u32576afa" id="u32576afa">IP、IPX等属于第三层网络层的概念。</span></p>
   <p data-lake-id="uecc94be9" id="uecc94be9"><span data-lake-id="uecc15fff" id="uecc15fff"> </span></p>
   <p data-lake-id="u48916d85" id="u48916d85"><span data-lake-id="uff0abaf1" id="uff0abaf1">ATM、FDDI等属于第二层数据链路层的概念。</span></p>
  </blockquote>
  <p data-lake-id="udadd59a0" id="udadd59a0"><br></p>
  <p data-lake-id="uf7d0e902" id="uf7d0e902"><span data-lake-id="u8d5060b3" id="u8d5060b3">了解了网络协议的七层模型以后，再来看看负载均衡。我们可以很明确的一点是，</span><strong><span data-lake-id="u9dff5fde" id="u9dff5fde">负载均衡是要在网络传输中做文章的</span></strong><span data-lake-id="u71df34c5" id="u71df34c5">。而要在网络传输过程搞事情，那么这七层模型就势必躲不开。</span></p>
  <p data-lake-id="u43d15dc7" id="u43d15dc7"><br></p>
  <p data-lake-id="u2a9bb594" id="u2a9bb594"><span data-lake-id="u8df3647f" id="u8df3647f">所以，根据负载均衡技术实现在OSI七层模型的不同层次，是可以给负载均衡分类的。</span></p>
  <p data-lake-id="u6239b327" id="u6239b327"><br></p>
  <p data-lake-id="u955a0e76" id="u955a0e76"><span data-lake-id="ua9d80256" id="ua9d80256">常见的实现方式中，主要可以在应用层、传输层、网络层和数据传输层做文章。所以，工作在应用层的负载均衡，我们通常称之为七层负载均衡、工作在传输层的我们称之为四层负载均衡。</span></p>
  <p data-lake-id="u88b5c7d2" id="u88b5c7d2"><br></p>
  <p data-lake-id="u4193ea32" id="u4193ea32"><span data-lake-id="u29758f3a" id="u29758f3a">大致可以分为以下几种，其中最常用的是四层和七层负载均衡：</span></p>
  <p data-lake-id="ub8ef9e2f" id="ub8ef9e2f"><br></p>
  <h3 data-lake-id="GE7Op" id="GE7Op"><span data-lake-id="uc4e922bf" id="uc4e922bf">二层负载均衡 </span></h3>
  <p data-lake-id="udd4e6069" id="udd4e6069"><span data-lake-id="u748cacf1" id="u748cacf1">​</span><br></p>
  <p data-lake-id="ucc6672e9" id="ucc6672e9"><span data-lake-id="u10ad8c6c" id="u10ad8c6c">负载均衡服务器对外依然提供一个VIP（虚IP），集群中不同的机器采用相同IP地址，但是机器的MAC地址不一样。当负载均衡服务器接受到请求之后，通过改写报文的目标MAC地址的方式将请求转发到目标机器实现负载均衡。</span></p>
  <p data-lake-id="u8bc37983" id="u8bc37983"><br></p>
  <h3 data-lake-id="aAjF8" id="aAjF8"><span data-lake-id="uda1e4126" id="uda1e4126">三层负载均衡</span></h3>
  <p data-lake-id="u2f50e06d" id="u2f50e06d"><br></p>
  <p data-lake-id="u2a07c6e1" id="u2a07c6e1"><span data-lake-id="u747da6e4" id="u747da6e4">和二层负载均衡类似，负载均衡服务器对外依然提供一个VIP（虚IP），但是集群中不同的机器采用不同的IP地址。当负载均衡服务器接受到请求之后，根据不同的负载均衡算法，通过IP将请求转发至不同的真实服务器。</span></p>
  <p data-lake-id="u1164645c" id="u1164645c"><br></p>
  <h3 data-lake-id="QtuXs" id="QtuXs"><span data-lake-id="u702414ec" id="u702414ec">四层负载均衡 </span></h3>
  <p data-lake-id="udf339fb4" id="udf339fb4"><span data-lake-id="ub6a3e89f" id="ub6a3e89f">​</span><br></p>
  <p data-lake-id="u638a1e6b" id="u638a1e6b"><span data-lake-id="ufd1bd8ad" id="ufd1bd8ad">四层负载均衡工作在OSI模型的传输层，由于在传输层，只有TCP/UDP协议，这两种协议中除了包含源IP、目标IP以外，还包含源端口号及目的端口号。四层负载均衡服务器在接受到客户端请求后，以后通过修改数据包的地址信息（IP+端口号）将流量转发到应用服务器。</span></p>
  <p data-lake-id="u8b6a132b" id="u8b6a132b"><br></p>
  <h3 data-lake-id="AnPTl" id="AnPTl"><span data-lake-id="u87cb09a3" id="u87cb09a3">七层负载均衡 </span></h3>
  <p data-lake-id="uf4c74284" id="uf4c74284"><span data-lake-id="ucd243126" id="ucd243126">​</span><br></p>
  <p data-lake-id="ub59073d5" id="ub59073d5"><span data-lake-id="ud27677fc" id="ud27677fc">七层负载均衡工作在OSI模型的应用层，应用层协议较多，常用http、radius、dns等。七层负载就可以基于这些协议来负载。这些应用层协议中会包含很多有意义的内容。比如同一个Web服务器的负载均衡，除了根据IP加端口进行负载外，还可根据七层的URL、浏览器类别、语言来决定是否要进行负载均衡。</span></p>
  <p data-lake-id="u11a4aec8" id="u11a4aec8"><br></p>
  <h2 data-lake-id="vExKB" id="vExKB"><span data-lake-id="udd1cdc26" id="udd1cdc26">负载均衡工具</span></h2>
  <p data-lake-id="ub62c0316" id="ub62c0316"><br></p>
  <p data-lake-id="u29dda7be" id="u29dda7be"><span data-lake-id="u11da695b" id="u11da695b">市面上有很多开源的负载均衡的工具或软件，基本都是基于前面提到的方案实现的，大多数是工作在第七层和第四层的。Nginx/LVS/HAProxy是目前使用最广泛的三种负载均衡软件。</span></p>
  <p data-lake-id="u8b38358f" id="u8b38358f"><br></p>
  <p data-lake-id="uea668133" id="uea668133"><strong><span data-lake-id="uc9ed6386" id="uc9ed6386">LVS</span></strong><span data-lake-id="uaaf9c42d" id="uaaf9c42d"> LVS（Linux Virtual Server），也就是Linux虚拟服务器, 是一个由章文嵩博士发起的自由软件项目。使用LVS技术要达到的目标是：通过LVS提供的负载均衡技术和Linux操作系统实现一个高性能、高可用的服务器群集，它具有良好可靠性、可扩展性和可操作性。从而以低廉的成本实现最优的服务性能。</span></p>
  <p data-lake-id="u99965fcd" id="u99965fcd"><br></p>
  <p data-lake-id="u6066c595" id="u6066c595"><span data-lake-id="u7343a598" id="u7343a598">LVS主要用来做四层负载均衡。</span></p>
  <p data-lake-id="uab4bd005" id="uab4bd005"><br></p>
  <h3 data-lake-id="t74eW" id="t74eW"><span data-lake-id="u0b45ccaf" id="u0b45ccaf">Nginx </span></h3>
  <p data-lake-id="u663cb0f4" id="u663cb0f4"><span data-lake-id="u7bdf4c4d" id="u7bdf4c4d">​</span><br></p>
  <p data-lake-id="u294e00b8" id="u294e00b8"><span data-lake-id="u1f20f227" id="u1f20f227">Nginx（发音同engine x）是一个网页服务器，它能反向代理HTTP, HTTPS, SMTP, POP3, IMAP的协议链接，以及一个负载均衡器和一个HTTP缓存。</span></p>
  <p data-lake-id="u1f4e40fb" id="u1f4e40fb"><br></p>
  <p data-lake-id="u0671d978" id="u0671d978"><span data-lake-id="u6effe0c1" id="u6effe0c1">Nginx主要用来做七层负载均衡。</span></p>
  <p data-lake-id="u45dce858" id="u45dce858"><br></p>
  <h3 data-lake-id="RbIQA" id="RbIQA"><span data-lake-id="u40a2848e" id="u40a2848e">HAProxy </span></h3>
  <p data-lake-id="u1cab22d6" id="u1cab22d6"><span data-lake-id="u6d3b5016" id="u6d3b5016">​</span><br></p>
  <p data-lake-id="u34f3be4b" id="u34f3be4b"><span data-lake-id="ub698e0ab" id="ub698e0ab">HAProxy是一个使用C语言编写的自由及开放源代码软件，其提供高可用性、负载均衡，以及基于TCP和HTTP的应用程序代理。</span></p>
  <p data-lake-id="u1459f9ae" id="u1459f9ae"><br></p>
  <p data-lake-id="u61963089" id="u61963089"><span data-lake-id="ufea53d92" id="ufea53d92">HAProxy主要用来做七层负载均衡。</span></p>
  <p data-lake-id="ua70d4db8" id="ua70d4db8"><br></p>
  <p data-lake-id="uae1aeb81" id="uae1aeb81"><br></p>
  <h2 data-lake-id="etS3M" id="etS3M"><span data-lake-id="ub0a59d01" id="ub0a59d01">常见负载均衡算法</span></h2>
  <p data-lake-id="u03a62b49" id="u03a62b49"><br></p>
  <p data-lake-id="uc0ab1fbc" id="uc0ab1fbc"><span data-lake-id="u312077c1" id="u312077c1">负载均衡服务器在决定将请求转发到具体哪台真实服务器的时候，是通过负载均衡算法来实现的。负载均衡算法，是一个负载均衡服务器的核心。</span></p>
  <p data-lake-id="u78421bbd" id="u78421bbd"><br></p>
  <p data-lake-id="u05b0f6ee" id="u05b0f6ee"><span data-lake-id="u9971bd0b" id="u9971bd0b">负载均衡算法可以分为两类：静态负载均衡算法和动态负载均衡算法。</span></p>
  <p data-lake-id="u9d3fb570" id="u9d3fb570"><br></p>
  <p data-lake-id="uea54b9ae" id="uea54b9ae"><span data-lake-id="u27a0990e" id="u27a0990e">静态负载均衡算法包括：轮询，比率，优先权</span></p>
  <p data-lake-id="u5fab3b50" id="u5fab3b50"><br></p>
  <p data-lake-id="u887de447" id="u887de447"><span data-lake-id="ub390637a" id="ub390637a">动态负载均衡算法包括: 最少连接数,最快响应速度，观察方法，预测法，动态性能分配，动态服务器补充，服务质量，服务类型，规则模式。</span></p>
  <p data-lake-id="ub640f4aa" id="ub640f4aa"><br></p>
  <ul list="u9f0086ac">
   <li fid="u2066dcc2" data-lake-id="ud2e8835d" id="ud2e8835d"><span data-lake-id="u520de38e" id="u520de38e">轮询（Round Robin）：顺序循环将请求一次顺序循环地连接每个服务器。当其中某个服务器发生第二到第7 层的故障，BIG-IP 就把其从顺序循环队列中拿出，不参加下一次的轮询，直到其恢复正常。</span></li>
   <li fid="u2066dcc2" data-lake-id="uc0a9bce5" id="uc0a9bce5"><span data-lake-id="u48474f58" id="u48474f58">比率（Ratio）：给每个服务器分配一个加权值为比例，根椐这个比例，把用户的请求分配到每个服务器。当其中某个服务器发生第二到第7 层的故障，BIG-IP 就把其从服务器队列中拿出，不参加下一次的用户请求的分配, 直到其恢复正常。</span></li>
   <li fid="u2066dcc2" data-lake-id="ue7a8f07d" id="ue7a8f07d"><span data-lake-id="ue994238c" id="ue994238c">优先权（Priority）：给所有服务器分组,给每个组定义优先权，BIG-IP 用户的请求，分配给优先级最高的服务器组（在同一组内，采用轮询或比率算法，分配用户的请求）；当最高优先级中所有服务器出现故障，BIG-IP 才将请求送给次优先级的服务器组。这种方式，实际为用户提供一种热备份的方式。</span></li>
   <li fid="u2066dcc2" data-lake-id="u3fec5ad3" id="u3fec5ad3"><span data-lake-id="u87639c3a" id="u87639c3a">最少的连接方式（Least Connection）：传递新的连接给那些进行最少连接处理的服务器。当其中某个服务器发生第二到第7 层的故障，BIG-IP 就把其从服务器队列中拿出，不参加下一次的用户请求的分配, 直到其恢复正常。</span></li>
   <li fid="u2066dcc2" data-lake-id="ub146cc65" id="ub146cc65"><span data-lake-id="u35480f39" id="u35480f39">最快模式（Fastest）：传递连接给那些响应最快的服务器。当其中某个服务器发生第二到第7 层的故障，BIG-IP 就把其从服务器队列中拿出，不参加下一次的用户请求的分配，直到其恢复正常。</span></li>
   <li fid="u2066dcc2" data-lake-id="u3be06f51" id="u3be06f51"><span data-lake-id="uaae29ba4" id="uaae29ba4">观察模式（Observed）：连接数目和响应时间以这两项的最佳平衡为依据为新的请求选择服务器。当其中某个服务器发生第二到第7 层的故障，BIG-IP就把其从服务器队列中拿出，不参加下一次的用户请求的分配，直到其恢复正常。</span></li>
   <li fid="u2066dcc2" data-lake-id="u62bae1ac" id="u62bae1ac"><span data-lake-id="u5c27fd76" id="u5c27fd76">预测模式（Predictive）：BIG-IP利用收集到的服务器当前的性能指标，进行预测分析，选择一台服务器在下一个时间片内，其性能将达到最佳的服务器相应用户的请求。(被BIG-IP 进行检测)</span></li>
   <li fid="u2066dcc2" data-lake-id="u1673fd1c" id="u1673fd1c"><span data-lake-id="uaf198a53" id="uaf198a53">动态性能分配(Dynamic Ratio-APM):BIG-IP 收集到的应用程序和应用服务器的各项性能参数，动态调整流量分配。</span></li>
   <li fid="u2066dcc2" data-lake-id="u7b41bec9" id="u7b41bec9"><span data-lake-id="ub9548fb3" id="ub9548fb3">动态服务器补充(Dynamic Server Act.):当主服务器群中因故障导致数量减少时，动态地将备份服务器补充至主服务器群。</span></li>
   <li fid="u2066dcc2" data-lake-id="ufbbf6aca" id="ufbbf6aca"><span data-lake-id="ud122bfd2" id="ud122bfd2">服务质量(QoS）:按不同的优先级对数据流进行分配。</span></li>
   <li fid="u2066dcc2" data-lake-id="u96339412" id="u96339412"><span data-lake-id="ue8f6ebf1" id="ue8f6ebf1">服务类型(ToS): 按不同的服务类型（在Type of Field中标识）负载均衡对数据流进行分配。</span></li>
   <li fid="u2066dcc2" data-lake-id="u8cc54c5d" id="u8cc54c5d"><span data-lake-id="u8eec35f7" id="u8eec35f7">规则模式：针对不同的数据流设置导向规则，用户可自行。</span></li>
  </ul>
  <p data-lake-id="u0958ddd4" id="u0958ddd4"><br></p>
  <p data-lake-id="u872c1cb7" id="u872c1cb7"><span data-lake-id="u6bb6c2f4" id="u6bb6c2f4">以上，就是目前实现负载均衡的主流算法。不同的负载均衡服务器会选择不同的算法。就像电影院和火车站可能会选用不同的引导策略一样。火车站可能会把行李少的旅客分配到一个专门的入口，可能给即将发车的旅客分派到特快入口，手持可扫描车票的用户单独分配到特殊入口等。</span></p>
 </body>
</html>